/*
 * Copyright 2007-2010 Jeremy Brown.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @author <a href="http://jeremy-brown.com">Jeremy Brown</a>
 */


package groovy.prefuse.factory

import prefuse.action.*
import prefuse.Visualization

public class ActionListFactory extends AbstractFactory
{
	boolean isLeaf()
	{
		return false
	}
    
    public Object newInstance(FactoryBuilderSupport builder, Object name, Object value, Map attributes) throws InstantiationException, IllegalAccessException
	{
		builder.context.put("name", attributes.remove("name")) //ActionList will be added to Visualization with this name
				
		def actionList = new ActionList()
		
		if(value == null && attributes.actionList)
		{
			value = attributes.remove("actionList")
		}
		
		if(value instanceof List)
		{
			//assign list of Action or Layout items to this ActionList
			value.each{item->
				if(item instanceof Action)
				{
					actionList.add(item)
				}
			}
		}
		else if(value instanceof ActionList)
		{
			actionList = value
		}
		
		return actionList
	}

	public void setParent(FactoryBuilderSupport builder, Object parent, Object child) 
	{
		//don't add a ActionList to parent until it is completed (in onNodeCompleted)
    }
	
	public void onNodeCompleted(FactoryBuilderSupport builder, Object parent, Object child) 
	{
		if(parent instanceof Visualization)
		{
			parent.putAction(builder.context.name, child)
		}
		else if(parent instanceof CompositeAction)
		{
			parent.add(child)
		}
    }
}
